package main

import "fmt"

// 闭包是指由权访问另一个函数作用域中的变量的函数
// 创建闭包常见的方式就是再一个函数内部创建另一个函数
// 通过拎一个函数访问另一个函数的变量，并返回这个函数

// 注意：由于闭包里作用域返回的局部变量资源不会立刻被销毁回收，
// 所以可能会占用更多内存，过度使用闭包会导致性能下降，建议在非常有必要的时候才使用闭包

func adder1() func() int {
	var i = 10
	return func() int {
		return i + 1
	}
}

func adder2() func(y int) int {
	var i = 10
	return func(y int) int {
		i += y // 在这里改变i会让adder2函数的行为发生变化 常驻内存
		return i
	}
}

// 闭包功能：常驻内存 不污染全局
func main() {
	// 调用adder函数，返回一个函数
	add := adder1()
	// 调用add函数，返回一个整数
	fmt.Println(add()) // 11
	fmt.Println(add()) // 11

	fn := adder2()
	fmt.Println(fn(5)) // 15
	fmt.Println(fn(5)) // 20
}